前后端分离项目docker下nginx https配置

Author Avatar
MagicDo 11月 17, 2019
  • 在其它设备中阅读本文章

https 简介

https 是目前最流行的http安全形式。使用https时。所有http请求和响应数据在发送到网络之前,都要进行加密。https在http下面提供了一个传输级的密码安全层。其大体结构如下:

​ 大部分困难的编码和解码都是在ssl库中完成的。所以web客户端和服务器在使用安全的http 协议时无需过多的修改其处理逻辑协议。通过https 建立安全的web事务后,浏览器就会自动获取所连接的服务器数字证书,浏览器收到证书会对签发机构进行检查,如果浏览器无法确认该证书的签名,就会向用户展示对话框。
https 将http协议与一组强大的对称的、非对称和基于证书的加密技术结合在一起,保证安全的同时还保证灵活性。

以下是http和https事务的对比


简化版的SSL握手如下:

前端项目部署https

自己生成https 证书

在本地调试的话,我们需要自己生成个https证书。

1
2
3
4
5
6
7
#!/bin/bash
openssl genrsa -des3 -out server.key 2048
openssl rsa -in server.key -out server.key
openssl req -new -key server.key -out server.csr
openssl req -new -x509 -key server.key -out ca.crt -days 3650
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt
ls -l

我们在linux 下利用 openssl 生成呢证书,生成的server.key 和server.crt 就是需要的文件。(参考 https://www.cnblogs.com/php-no-2/p/11276323.html

其中Country Name填CN,Common Name填主机名也可以不填,如果不填浏览器会认为不安全.(例如你以后的url为https://abcd/xxxx….这里就可以填abcd),其他的都可以不填。

docker 下nginx 配置

没配置过的可以参考 ![docker下配置nginx](http://blog.magicdu.cn/585.html

配置文件的主要配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
upstream web { 
ip_hash;
server 192.168.153.128:8080;
}
server {
listen 443 ssl;
server_name localhost;

ssl_certificate server.crt;
ssl_certificate_key server.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;


location / {
proxy_pass http://web;
}
}

上面就是代理 我们的前端到 nginx https 下了,但是直接访问后端的话,会报错

1
but requested an insecure XMLHttpRequest endpoint ‘http://192.168.153.128:2019/api/hello’. This request has been blocked; the content must be served over HTTPS.

大致意思就是https网站内不可以发送http请求,并且http请求直接被拦截并不发送到后台服务器。如何解决呢,由于我们后端都是一个个微服务,所以将后端都改成https 这种方式不科学,那么我们也可以向代理前端一样来使用nginx https 来代理http的后端。

nginx https 代理后端 http接口

其主要配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
upstream gateway { 
ip_hash;
server 192.168.10.241:2019;
}
server {
listen 2019 ssl;
server_name localhost;

ssl_certificate server.crt;
ssl_certificate_key server.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

location / {
proxy_pass http://gateway;
}
}

然后把我们的前端调用api 的地址改成 https 代理的后端地址就可以了。

最后,附上 docker 下的部署脚本如下:

1
2
3
4
5
6
7
8
9
echo 'start docker nginx-https'
docker stop nginx-https
docker rm nginx-https
docker run -d -p 80:80 -p 443:443 -p 2019:2019 --name nginx-https --restart=always nginx
docker cp nginx-https.conf nginx-https:/etc/nginx/nginx.conf
docker cp server.crt nginx-https:/etc/nginx/server.crt
docker cp server.key nginx-https:/etc/nginx/server.key
docker restart nginx-https
echo 'success'